package HashMap.Nodo.Operaciones;

import HashMap.Nodo.Clase;
import HashMap.Nodo.Nodo;
import HashMap.Nodo.Operacion;

public class OperacionesEntradaSalida implements Operacion {

    private Nodo nodoIO;

    public OperacionesEntradaSalida(Nodo nodo, String operacion) {
        if (nodo.getNivelDeIndireccion() < 2 && nodo.getClase() == Clase.ESCALAR && !"CPRINTF".equals(operacion)) {
            this.nodoIO = nodo;
            this.nodoIO.setOperacion(operacion);
        } else if (nodo.getClase() == Clase.CONJUNTO || nodo.getClase() == Clase.VECTOR) {
            this.nodoIO = nodo;
            this.nodoIO.setOperacion("CPRINTF");
        } else {
            throw new UnsupportedOperationException("El nivel de indirección debe ser "
                    + "inferior a 2 y de tipo escalar ó CPRINTF se aplica a conjunto o vectores");
        }
    }

    @Override
    public int getLongitud() {
        throw new UnsupportedOperationException("Operación no soportada");
    }

    @Override
    public String generarCodigoNASM() {
        switch (nodoIO.getOperacion()) {
            case "SCANF":
                return generarCodigoNASMscanf();
            case "PRINTF":
                return generarCodigoNASMprintf();
            case "CPRINTF":
                return generarCodigoNASMcprintf();
            default:
                return null;
        }
    }

    @Override
    public Nodo generarNodo(String tokenOperacion) {
        throw new UnsupportedOperationException("Operación no soportada");
    }

    private String generarCodigoNASMscanf() {
        return "call scanf [" + nodoIO.getNombre() + "]";
    }

    private String generarCodigoNASMprintf() {
        return "call printf [" + nodoIO.getNombre() + "]";
    }

    private String generarCodigoNASMcprintf() {
        return "call cprintf [" + nodoIO.getNombre() + "]";
    }
}
